import { format } from 'sql-formatter'

// 默认格式化选项
const DEFAULT_OPTIONS = {
  language: 'sql',
  indent: '  ',
  uppercase: true,
  linesBetweenQueries: 2
}

// 数据库类型到sql-formatter方言的映射
const DB_TYPE_TO_LANGUAGE = {
  mysql: 'mysql',
  mariadb: 'mysql',
  postgresql: 'postgresql',
  postgres: 'postgresql',
  pg: 'postgresql',
  sqlserver: 'tsql',
  mssql: 'tsql',
  tsql: 'tsql',
  sqlite: 'sqlite',
  oracle: 'plsql',
  plsql: 'plsql'
}

/**
 * 格式化SQL语句
 * @param {string} sql - 要格式化的SQL语句
 * @param {string} dbType - 数据库类型
 * @param {object} options - 格式化选项
 * @returns {string} 格式化后的SQL语句
 */
export const formatSql = (sql, dbType = '', options = {}) => {
  if (!sql || typeof sql !== 'string') {
    return ''
  }

  try {
    const formatOptions = { ...DEFAULT_OPTIONS, ...options }
    
    // 根据数据库类型设置语言
    if (dbType && DB_TYPE_TO_LANGUAGE[dbType.toLowerCase()]) {
      formatOptions.language = DB_TYPE_TO_LANGUAGE[dbType.toLowerCase()]
    }

    return format(sql, formatOptions)
  } catch (error) {
    console.warn('SQL格式化失败:', error)
    return sql // 返回原始SQL
  }
}

/**
 * 简单的SQL美化（不依赖外部库）
 * @param {string} sql - 要美化的SQL语句
 * @param {string} dbType - 数据库类型
 * @returns {string} 美化后的SQL语句
 */
export const beautifySql = (sql, dbType = '') => {
  if (!sql || typeof sql !== 'string') {
    return ''
  }

  // 数据库特定的关键词，用于更好的美化
  let additionalKeywords = []
  if (dbType) {
    switch (dbType.toLowerCase()) {
      case 'mysql':
      case 'mariadb':
        additionalKeywords = ['LIMIT', 'OFFSET', 'PROCEDURE', 'LOCK', 'USING']
        break
      case 'postgresql':
      case 'postgres':
      case 'pg':
        additionalKeywords = ['LIMIT', 'OFFSET', 'RETURNING', 'USING', 'WINDOW']
        break
      case 'sqlserver':
      case 'mssql':
      case 'tsql':
        additionalKeywords = ['TOP', 'OUTPUT', 'MERGE', 'PIVOT', 'UNPIVOT']
        break
      case 'oracle':
      case 'plsql':
        additionalKeywords = ['CONNECT BY', 'START WITH', 'PRIOR', 'MODEL']
        break
      case 'sqlite':
        additionalKeywords = ['LIMIT', 'OFFSET', 'PRAGMA', 'VACUUM']
        break
    }
  }

  let formatted = sql
    // 移除多余的空格
    .replace(/\s+/g, ' ')
    .trim()
    
    // 在关键词前后添加换行
    .replace(/\b(SELECT|FROM|WHERE|JOIN|INNER JOIN|LEFT JOIN|RIGHT JOIN|GROUP BY|ORDER BY|HAVING)\b/gi, '\n$1')
    
    // 添加数据库特定关键词的换行
    .replace(new RegExp(`\\b(${additionalKeywords.join('|')})\\b`, 'gi'), '\n$1')
    
    // 在逗号后添加换行（在SELECT子句中）
    .replace(/,(?=\s*\w)/g, ',\n  ')
    
    // 缩进
    .split('\n')
    .map((line, index) => {
      const trimmed = line.trim()
      if (index === 0 || trimmed.match(/^(SELECT|FROM|WHERE|JOIN|GROUP BY|ORDER BY|HAVING)/i)) {
        return trimmed
      }
      return '  ' + trimmed
    })
    .join('\n')

  return formatted
}

/**
 * 压缩SQL（移除不必要的空格和换行）
 * @param {string} sql - 要压缩的SQL语句
 * @returns {string} 压缩后的SQL语句
 */
export const compressSql = (sql) => {
  if (!sql || typeof sql !== 'string') {
    return ''
  }

  return sql
    .replace(/\s+/g, ' ')
    .replace(/\s*([(),;])\s*/g, '$1')
    .trim()
}

export default {
  formatSql,
  beautifySql,
  compressSql
} 